#pragma once
// ==================包含板上外设头文件====================
#include "ti_msp_dl_config.h"
// ==================包含板上外设头文件====================
namespace hal {}

namespace hal {
template <uint32_t PortBase, uint32_t Pin> class gpio {
private:
  /**
   * @brief 获取GPIO端口寄存器指针
   * @return GPIO_Regs* 端口寄存器指针
   */
  static inline GPIO_Regs *port() {
    return reinterpret_cast<GPIO_Regs *>(PortBase);
  }

public:
  /**
   * @brief 初始化GPIO（需外部配置）
   * @note
   * 实际配置需调用TI库的DL_GPIO_initDigitalInput/DL_GPIO_initDigitalOutput
   */
  static inline void init() {
    // 初始化代码需用户根据具体需求实现
    // 示例：DL_GPIO_initDigitalOutput(pincmIndex);
  }

  /**f
   * @brief 设置为输出模式
   * @details 调用DL_GPIO_enableOutput使能引脚输出功能
   */
  static inline void setOutput() { DL_GPIO_enableOutput(port(), Pin); }

  /**
   * @brief 设置为输入模式
   * @details 调用DL_GPIO_disableOutput禁用引脚输出功能
   */
  static inline void setInput() { DL_GPIO_disableOutput(port(), Pin); }

  /**
   * @brief 设置引脚高电平
   * @details 调用DL_GPIO_setPins设置对应引脚
   */
  inline static void high() { DL_GPIO_setPins(port(), Pin); }

  /**
   * @brief 设置引脚低电平
   * @details 调用DL_GPIO_clearPins清除对应引脚
   */
  inline static void low() { DL_GPIO_clearPins(port(), Pin); }

  /**
   * @brief 翻转引脚电平
   * @details 调用DL_GPIO_togglePins翻转对应引脚
   */
  inline static void toggle() { DL_GPIO_togglePins(port(), Pin); }

  /**
   * @brief 读取引脚状态
   * @return true-高电平, false-低电平
   * @details 调用DL_GPIO_readPins读取引脚状态
   */
  inline static bool read() { return (DL_GPIO_readPins(port(), Pin) != 0); }

  /**
   * @brief 写入引脚状态
   * @param state 要设置的状态
   */
  static void write(bool state) { state ? high() : low(); }
};
} // namespace bsp
